Kao što smo u predgovoru napisali, ovaj kurs bi najbolje bilo preći tako što ćeš posle čitanja lekcija preći na izradu zadataka pomoću kojih ćeš praktično utvrditi znanje stečeno u lekciji. Ceo portal petlja.org je osmišljen tako da učiš kroz samostalan rad na programerskim zadacima. Preporučuje se da prvo pročitaš teorijski uvod za svaku od lekcija, zatim da pokušaš da napišeš program koji rešava dati zadatak, a onda i da proveriš da li si ga dobro napisao preko automatske provere na našem portalu.
Nakon što sam napišeš program i dođeš do tačke da misliš da je zadatak rešen, C# fajl koji sadrži tvoje rešenje možeš da pošalješ, tj. aploduješ (od engleske reči upload) na proveru na stranici gde je zadatak okačen. Takođe, možeš pisati kod i direktno u našoj formi za slanje rešenja. Međutim, da bi mogao da pošalješ svoje rešenje ili koristiš našu formu za slanje rešenja, potrebno je da budeš ulogovan na portal. U tom slučaju će ti biti dostupne: opcija za izbor programskog jezika Izaberi programski jezik, dugme za izbor fajla sa kodom [Učitaj] i dugme za predaju [Pošalji].
Fajl sa programskim kodom se zove "Program.cs" i nalazi se unutar foldera sa nazivom projekta, na primer, ConsoleApplication1\\ConsoleApplication1
kako je prikazano na sledećoj slici. Podrazumevana lokacija na kojoj Visual Studio čuva projekte je Documents\\Visual Studio 2015\\Projects
i tamo ćeš pronaći svoj program osim ako nisi uneo drugu lokaciju prilikom kreiranja projekta.
Sistem će preuzeti tvoj C# fajl, kompajlirati u exe fajl i izvršiti više testova nad njim koji će pokazati da li je zadatak dobro rešen.
Ako rešiš da kod ukucavaš direktno u našu formu za slanje rešenja, potrebno je samo da pritisneš dugme [Pošalji] i sistem će testirati tvoj kod i reći ti da li je zadatak dobro rešen ili ne.
Testiranje kodova
Testiranje je automatizovano, tako da svi protokoli moraju biti formalno i strogo definisani.
Sama procedura testiranje je sledeća:
- Korisnik pošalje (eng. submit) rešenje problema i označi u kom programskom jeziku je poslati kod.
- Grejder (sistem za automatsku proveru) prihvata zahteva za testiranje. Zahtev se može opisati četvorkom (korisnik, zadatak, kod, programski jezik).
- Grejder zatim kompajlira primljeni kod, za dati programski jezik, čime se dobija izvršni program (exe fajl) koji treba testirati.
- Svaki zadatak sadrži niz test primera. Za svaki od test primer grejder će odraditi sledeće:
- Pokreće se korisnikov program.
- Na standardni ulaz se prosleđuje ulaz trenutnog test primera (input).
- Ukoliko korisnikov program radi duže od datog vremenskog ograničenja, program se prekida i test primer se proglašava neuspešnim.
- Vrši se provera memorijskog ograničenja: ukoliko program iskoristi više od dozvoljene memorije, test primer se proglašava neuspešnim.
- Grejder uzima njegov rezultat koji je dat preko standardnog izlaza.
- Zatim se proverava tačnost rešenja.
- Ukoliko je rešenje tačno, test primer se proglašava uspešnim; u suprotnom proglašava se neuspešnim.
- Da bi zadatak bio prihvaćen, korisnikov program mora uspešno rešiti sve test primere.
Na sledećoj slici je grafički prikazano kako radi grejder.
Na kraju procesa testiranja ćeš dobiti izveštaj o uspešnosti tvog rešenja. Ukoliko nisi uspeo da pokriješ sve slučajeve (što se svim programerima često dešava) moraćeš da se vratiš na programski kod svog rešenja i pokušaš ponovo.
Obrati pažnju
Potrebno je obratiti posebnu pažnju na to da grejder uzima rezultat koji je dat preko standardnog izlaza. Da bi se uopšte moglo vršiti automatsko testiranje, tvoj program mora poštovati formate ulaza i izlaza koji su strogo definisani u svakom problemu. Primera radi, ukoliko na kraju rezultat, koji je jednak 5, štampaš uz rečenicu: "konacno resenje je: 5", test primer neće biti uspešan bez obzira da li je 5 tačno rešenje ili ne. Razlog za ovo je to što će grejder upoređivati broj 5 (tačno rešenje) sa tvojim rešenjem - rečenicom "konacno resenje je: 5". Tačnije ovo rešenje neće proći ni samo parsiranje u ceo broj za ovaj primer.
Mnogi će reći da su ovo nebitne greške koje nemaju veze sa samim algoritmom, što je donkle tačno, ali, kao takve, ukoliko do njih dođe, potrebno je da budu ispravljene da bi rešenje bilo prihvaćeno. Možda ovo zvuči surovo, ali ovakva pravila moraju postojati inače će se u suprotnom nametnuti pitanje gde povući granicu za menjanje koda, to jest pitanja šta jeste, a šta nije suštinska greška. Moguće je zamisliti argument: ukoliko se u mom kodu na tom i tom mestu promeni karakter x
u Y
moj algoritam bi bio korektan. Naravno, ovakva žalba bila bi neosnovana, budući da se u ovakvim slučajevima, iako se takođe radi o samo jednom karakteru, greška može proisteći i iz suštinskog nerazumevanja problema.
Takođe, obrati pažnju i na sledeće. Možda si u nekim primerima video da programeri na kraju programskog koda stavljaju red Console.ReadKey();
, ili neki sličan, da bi prozor sa rešenjem ostao aktivan čak i ukoliko se program pokrene sa F5 (umesto Ctrl+F5). Ukoliko ovo isto koristiš u svojim programima, obavezno ovaj red obriši pre nego što pošalješ zadatak na proveru.